package com.demo.java.OD501_550.OD522;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【发广播(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146485493
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);

        // 读取输入并构建矩阵
        String[] s = in.nextLine().split(" ");
        int n = s.length; // 获取矩阵的大小
        int[][] matrix = new int[n][n];

        // 读取矩阵的第一行
        for (int i = 0; i < n; i++) {
            matrix[0][i] = Integer.parseInt(s[i]);
        }

        int m = 1;
        // 继续读取矩阵的其余行
        while (n > m) {
            for (int i = 0; i < n; i++) {
                matrix[m][i] = in.nextInt();
            }
            m++;
        }

        // 存储每个连通分量的站点集合
        Map<Integer, List<Integer>> map = new HashMap<>();

        // 遍历矩阵并查找每个站点的连通分量
        int mapKey = 0;
        for (int i = 0; i < matrix.length; i++) {
            boolean containFlag = false;
            // 检查当前站点是否属于已存在的连通分量
            for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
                if (entry.getValue().contains(i)) {
                    containFlag = true;
                    mapKey = entry.getKey();
                }
            }

            // 如果当前站点不属于任何连通分量，则创建新的连通分量
            if (!containFlag) {
                map.put(i, new ArrayList<>());
                mapKey = i;
            }

            // 将与当前站点相连接的站点加入当前连通分量
            for (int j = i; j < matrix.length; j++) {
                if (i != j && matrix[i][j] == 1) {
                    map.get(mapKey).add(j);
                }
            }
        }

        // 输出连通分量的数量，即所需广播服务器的数量
        System.out.print(map.size());
    }
}